package com.sbx.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sbx.entity.dto.AppStore;
import com.sbx.entity.dto.User;
import com.sbx.entity.dto.UserApp;
import com.sbx.mapper.AppStoreMapper;
import com.sbx.mapper.UserAppMapper;
import com.sbx.mapper.UserMapper;
import com.sbx.service.AppStoreService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;


@Service
public class AppStoreServiceImpl implements AppStoreService {
    @Resource
    private AppStoreMapper appStoreMapper;
    @Resource
    private UserAppMapper userAppMapper;
    @Resource
    private UserMapper userMapper;


    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveStoreApp(AppStore appStore) {
        appStore.setCreated(new Date());
        appStoreMapper.insert(appStore);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteAppStoreById(String id) {
        appStoreMapper.deleteById(id);
    }


    @Override
    public Page<?> getAppStorePage(AppStore appStore, Integer pageIndex, Integer pageSize) {
        Page<AppStore> appStorePage = new Page<>(pageIndex, pageSize);
        LambdaQueryWrapper<AppStore> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(!StringUtils.isEmpty(appStore.getName()), AppStore::getName, appStore.getName());
        wrapper.like(!StringUtils.isEmpty(appStore.getNote()), AppStore::getNote, appStore.getNote());
        wrapper.like(!StringUtils.isEmpty(appStore.getTag()), AppStore::getTag, appStore.getTag());

        return appStoreMapper.selectPage(appStorePage, wrapper);
    }


    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateStoreApp(AppStore appStore) {
        appStoreMapper.updateById(appStore);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveUserApp(String userId, String appId) {
        UserApp userApp = selectUserAppById(userId, appId);
        Assert.isNull(userApp, "该应用已添加，不可重复添加！");
        AppStore appStore = selectAppStore(appId);
        Assert.notNull(appStore, "该应用不存在，请从新选择！");
        User user = selectUser(userId);
        Assert.notNull(user, "该用户不存在！");
        UserApp userApp1 = new UserApp();
        userApp1.setCreated(new Date()).setAppId(appId).setUserId(userId);
        userAppMapper.insert(userApp1);
    }


    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteUserAppById(String userId, String appId) {
        userAppMapper.delete(new LambdaQueryWrapper<UserApp>().eq(UserApp::getUserId, userId).eq(UserApp::getAppId, appId));
    }

    @Override
    public Page<?> getUserAppPage(String userId, Integer pageIndex, Integer pageSize) {
        Page<AppStore> appStorePage = new Page<>(pageIndex, pageSize);
        List<UserApp> userApps = userAppMapper.selectList(new LambdaQueryWrapper<UserApp>().eq(UserApp::getUserId, userId));
        if (CollectionUtils.isEmpty(userApps)) {
            return new Page<>();
        }
        List<String> appIds = userApps.stream().map(UserApp::getAppId).collect(Collectors.toList());
        return appStoreMapper.selectPage(appStorePage, new LambdaQueryWrapper<AppStore>().in(AppStore::getId, appIds));

    }


    public List<AppStore> selectUserApp(String id) {
        if (StringUtils.isEmpty(id)) {
            return Collections.emptyList();
        }

        LambdaQueryWrapper<UserApp> userAppWrapper = new LambdaQueryWrapper<>();
        userAppWrapper.eq(UserApp::getUserId, id);
        List<UserApp> userApps = userAppMapper.selectList(userAppWrapper);
        if (CollectionUtils.isEmpty(userApps)) {
            return Collections.emptyList();
        }

        LambdaQueryWrapper<AppStore> appStoreWrapper = new LambdaQueryWrapper<>();
        appStoreWrapper.in(AppStore::getId, userApps.stream().map(UserApp::getAppId).collect(Collectors.toList()));

        return appStoreMapper.selectList(appStoreWrapper);

    }

    private AppStore selectAppStore(String id) {
        LambdaQueryWrapper<AppStore> appStoreWrapper = new LambdaQueryWrapper<>();
        if (!StringUtils.isEmpty(id)) {
            appStoreWrapper.eq(AppStore::getId, id);
        }//where  xx=xx
        return appStoreMapper.selectOne(appStoreWrapper);
    }


    private User selectUser(String id) {
        LambdaQueryWrapper<User> userWrapper = new LambdaQueryWrapper<>();
        if (!StringUtils.isEmpty(id)) {
            userWrapper.eq(User::getId, id);
        }
        return userMapper.selectOne(userWrapper);
    }

    private UserApp selectUserAppById(String userId, String appId) {
        LambdaQueryWrapper<UserApp> userAppLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (!StringUtils.isEmpty(appId)) {
            userAppLambdaQueryWrapper.eq(UserApp::getAppId, appId).eq(UserApp::getUserId, userId);
        }
        return userAppMapper.selectOne(userAppLambdaQueryWrapper);


    }


}
